package com.whpost.service.wx.service;

import com.alibaba.fastjson.JSONObject;
import com.whpost.service.tools.ToolBean;
import jakarta.annotation.Resource;
import me.chanjar.weixin.mp.api.WxMpService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class WechatServices {

    @Resource
    private WxMpService wxMpService;

    private final RestTemplate restTemplate = new RestTemplate();
    // 缓存access_token及过期时间（避免频繁调用接口）
    private static final Map<String, Object> ACCESS_TOKEN_CACHE = new ConcurrentHashMap<>();

    /**
     * 获取access_token（带缓存，有效期2小时）
     */
    public String getAccessToken() {
        // 检查缓存是否有效
        String cachedToken = (String) ACCESS_TOKEN_CACHE.get("token");
        Long expireTime = (Long) ACCESS_TOKEN_CACHE.get("expireTime");
        if (cachedToken != null && expireTime != null && System.currentTimeMillis() < expireTime) {
            ToolBean.info("使用缓存的access_token");
            return cachedToken;
        }

        // 缓存失效，重新获取
        String url = String.format(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
                wxMpService.getWxMpConfigStorage().getAppId(), wxMpService.getWxMpConfigStorage().getSecret()
        );

        try {
            String response = restTemplate.getForObject(url, String.class);
            ToolBean.info("获取access_token响应：" + response);
            JSONObject json = JSONObject.parseObject(response);

            if (json.containsKey("errcode")) {
                String errMsg = json.getString("errmsg");
                throw new RuntimeException("获取access_token失败：" + errMsg);
            }

            String token = json.getString("access_token");
            int expiresIn = json.getIntValue("expires_in"); // 有效期（秒）
            // 缓存提前5分钟过期，避免临界点失效
            long newExpireTime = System.currentTimeMillis() + (expiresIn - 300) * 1000;

            ACCESS_TOKEN_CACHE.put("token", token);
            ACCESS_TOKEN_CACHE.put("expireTime", newExpireTime);
            ToolBean.info("获取新的access_token成功，有效期至：" + newExpireTime);
            return token;

        } catch (HttpStatusCodeException e) {
            String errResp = e.getResponseBodyAsString();
            throw new RuntimeException("获取access_token HTTP错误：" + errResp);
        } catch (Exception e) {
            throw new RuntimeException("获取access_token异常：" + e.getMessage());
        }
    }

    /**
     * 推送自定义菜单到微信服务器
     */
    public boolean createMenu() {
        try {
            // 1. 获取有效的access_token
            String accessToken = getAccessToken();
            String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken;

            // 2. 构造菜单结构（按微信规范定义）
            JSONObject menuJson = buildMenuJson();
            ToolBean.info("推送的菜单结构：" + menuJson.toJSONString());

            // 3. 发送POST请求创建菜单
            String response = restTemplate.postForObject(url, menuJson, String.class);
            ToolBean.info("菜单创建响应：" + response);
            JSONObject result = JSONObject.parseObject(response);

            // 4. 检查是否成功（errcode=0表示成功）
            if (result.getIntValue("errcode") == 0) {
                ToolBean.info("菜单推送成功");
                return true;
            } else {
                String errMsg = result.getString("errmsg");
                ToolBean.info("菜单推送失败：" + errMsg);
                return false;
            }

        } catch (HttpStatusCodeException e) {
            String errResp = e.getResponseBodyAsString();
            ToolBean.info("菜单推送HTTP错误：" + errResp);
            return false;
        } catch (Exception e) {
            ToolBean.info("菜单推送异常：" + e.getMessage());
            return false;
        }
    }

    /**
     * 构建菜单JSON结构（可根据需求修改）
     */
    private JSONObject buildMenuJson() {
        // 第一个主菜单：邮爱荆楚（2026）- 包含子菜单
        JSONObject mainBtn1 = new JSONObject();
        mainBtn1.put("name", "邮爱荆楚（2026）");

        // 子菜单1-1：活动介绍（跳转网页）
        JSONObject subBtn1 = new JSONObject();
        subBtn1.put("type", "view");
        subBtn1.put("name", "活动介绍");
        subBtn1.put("url", "https://mp.weixin.qq.com/s/FfRa4plc9JJANpxkYTqWSA");

        // 组装第一个主菜单的子菜单
        JSONObject subMenu1 = new JSONObject();
        subMenu1.put("sub_button", new JSONObject[]{subBtn1});
        mainBtn1.putAll(subMenu1);

        // 第二个主菜单：活动报名（沿用原有代码）
        JSONObject mainBtn2 = new JSONObject();
        mainBtn2.put("type", "view");
        mainBtn2.put("name", "活动报名");
        mainBtn2.put("url", "https://dkx.whsyzj.com/wx/pages/baoming/index");

        // 第三个主菜单：邮爱荆楚商城 - 包含子菜单
        JSONObject mainBtn3 = new JSONObject();
        mainBtn3.put("name", "邮爱荆楚商城");

        // 子菜单3-1：武邮购（跳转小程序）
        JSONObject subBtn3 = new JSONObject();
        subBtn3.put("type", "miniprogram");
        subBtn3.put("name", "武邮购");
        subBtn3.put("url", "http://mp.weixin.qq.com"); // 备用网页，当小程序无法打开时使用
        subBtn3.put("appid", "wxbfee3656cdf4433f");
        subBtn3.put("pagepath", "pages/home/dashboard/index");

        // 组装第三个主菜单的子菜单
        JSONObject subMenu3 = new JSONObject();
        subMenu3.put("sub_button", new JSONObject[]{subBtn3});
        mainBtn3.putAll(subMenu3);

        // 组装完整菜单
        JSONObject menu = new JSONObject();
        menu.put("button", new JSONObject[]{mainBtn1, mainBtn2, mainBtn3});
        return menu;
    }

}
